ElastiCache クラスターとノードの一覧を必要な情報に絞って AWS CLI で CSV 出力してみた
コンバンハ、千葉(幸)です。
かなりピンポイントですが、ElastiCache クラスターについてこういう一覧を作りたい機会がありました。
▲ エンジンの種類、バージョン、ノードタイプを一覧で見たい。
AWS CLI でやってみたよ、という話です。同じことをしたい方が 3 人くらいはいると思うので、参考になれば幸いです。
ElastiCache クラスターを一覧出力するコマンド
以下を実行しました。
$ aws elasticache describe-cache-clusters\ | jq -r ' ["クラスター/ノード名","ノードタイプ","エンジン","バージョン","ノード数"], (.CacheClusters[] | [.CacheClusterId, .CacheNodeType, .Engine, .EngineVersion, .NumCacheNodes]) | @csv'
jq で CSV 形式で出力する、といういつものパターンです。大好きです。
出力結果のイメージは以下の通りです。
"クラスター/ノード名","ノードタイプ","エンジン","バージョン","ノード数" "sample-cache-001","cache.m5.large","redis","2.8.22","1" "sample-cache-002","cache.m5.large","redis","2.8.22","1" "sample-cache-dev-001","cache.m5.large","redis","2.8.22","1" "sample-cache-dev-002","cache.m5.large","redis","2.8.22","1" "sample-cache-pro","cache.m3.medium","memcached","1.4.14","1" "sample-cache-test","cache.t1.micro","memcached","1.4.14","1" "sample-redis-001","cache.m3.medium","redis","3.2.10","1" "sample-redis-002","cache.m3.medium","redis","3.2.10","1" "exapmle-001","cache.m3.medium","redis","2.8.24","1" "exapmle-002","cache.m3.medium","redis","2.8.24","1" "exapmle-003","cache.m3.medium","redis","2.8.24","1" "exapmle-004","cache.m3.medium","redis","2.8.24","1" "exapmle-005","cache.m3.medium","redis","2.8.24","1" "exapmle-006","cache.m3.medium","redis","2.8.24","1" "exapmle-007","cache.m5.4xlarge","redis","5.0.6","1" "exapmle-008","cache.m5.4xlarge","redis","5.0.6","1" ...
describe-cache-clusters
今回実行した AWS CLI コマンドは以下です。
アウトプットのサンプルは以下で、ハイライト部をフィルタしています。
{ "CacheClusters": [ { "CacheClusterId": "my-cluster-003", "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:", "CacheNodeType": "cache.r5.large", "Engine": "redis", "EngineVersion": "5.0.5", "CacheClusterStatus": "available", "NumCacheNodes": 1, "PreferredAvailabilityZone": "us-west-2a", "CacheClusterCreateTime": "2019-11-26T01:22:52.396Z", "PreferredMaintenanceWindow": "mon:17:30-mon:18:30", "PendingModifiedValues": {}, "NotificationConfiguration": { "TopicArn": "arn:aws:sns:us-west-2:xxxxxxxxxxx152:My_Topic", "TopicStatus": "active" }, "CacheSecurityGroups": [], "CacheParameterGroup": { "CacheParameterGroupName": "default.redis5.0", "ParameterApplyStatus": "in-sync", "CacheNodeIdsToReboot": [] }, "CacheSubnetGroupName": "kxkxk", "AutoMinorVersionUpgrade": true, "SecurityGroups": [ { "SecurityGroupId": "sg-xxxxxd7b", "Status": "active" } ], "ReplicationGroupId": "my-cluster", "SnapshotRetentionLimit": 0, "SnapshotWindow": "06:30-07:30", "AuthTokenEnabled": false, "TransitEncryptionEnabled": false, "AtRestEncryptionEnabled": false, "ARN": "arn:aws:elasticache:us-west-2:xxxxxxxxxxx152:cluster:my-cache-cluster", "ReplicationGroupLogDeliveryEnabled": false, "LogDeliveryConfigurations": [ { "LogType": "slow-log", "DestinationType": "cloudwatch-logs", "DestinationDetails": { "CloudWatchLogsDetails": { "LogGroup": "test-log" } }, "LogFormat": "text", "Status": "active" } ] } ] }
ElastiCache のクラスターとは何か
ここまで見てきて、ElastiCache のクラスターってなんだ?というの分からなくなってきました。コマンドはdescribe-cache-clusters
ですが、結果はクラスター内のノード単位で出力されています。
今回の環境はマネジメントコンソールでは以下のように見えます。クラスターの中に複数のノードがあると表現されています。
個別のクラスターの詳細を確認すると、以下のように複数のノードからなることが分かります。AWS CLI ではここでのノードのひとつひとつがCacheClusterId
として返されています。
マネジメントコンソール上での「クラスター名」がコマンドのCacheClusterId
の結果となり、NumCacheNodes
で「2」が返ってくることを想定していた自分は少し面食らいました。
ElastiCache のクラスターはクラスターじゃない時もある
マネジメントコンソールにおいては、ElastiCache for Redis の以下構成は全てクラスターと表現されます。
- 単一のノード
- クラスターモード無効(単一のシャード)で1つ以上のレプリカノードが存在する
- クラスターモード有効で1つ以上のシャード上それぞれで 1つ以上のレプリカノードが存在する
そしてややこしいことに、ここでの「クラスター」はコンソール上の表示と API/CLI 上で扱われる時とで名称が変わります。
それを表したのが以下図(上記リンクより引用)で、ノード数が複数の場合、コンソールで「クラスター」と表示されているのは API/CLI では「レプリケーショングループ」と表現されます。
今回の例では、単一のシャード上でプライマリノードとレプリカノードが存在する構成でした。
ちなみに、既存の環境の「クラスター」のクラスターモードが有効か無効かは以下手段で確認できます。
describe-cache-clusters の「クラスター」が指すもの
上記で見たようなクラスター構成は ElastiCache for Redis に限定した話で、for Memcached ではシンプルに「クラスター」です。
一つのクラスター内に一つ以上のノードがある、という分かりやすい構成です。describe-cache-clusters
コマンドは対象が Memcached のみであれば理解がしやすいです。
対象が Redis の場合、「レプリケーショングループ」はここでは考慮されず、個々のノードに対して結果が得られます。そのため、 CLI の結果の一要素であるNumCacheNodes
は常に1
となります。
レプリケーショングループの切り口で結果を得たい場合にはまた別のコマンドを使用する必要があります。
このコマンドでは、以下のノードが対象外になります。
- Memcached エンジンのノード
- Redis エンジンの単一構成のノード
終わりに
ElastiCache 「クラスター」の一覧を出力してみました。
Redis と Memcached でのクラスターの考え方の違いを理解していなかったので、当初は結果の読み取り方に苦戦しました。describe-cache-clusters
は両者のエンジンに共通して使用できるため、以下のような違いが生まれることを把握しました。
- Redis
- 個々のノードに対して結果が得られる
--(no-)show-cache-clusters-not-in-replication-groups
オプションでレプリケーショングループに属するノードの出力有無をコントロールできる- デフォルトでは
no-
が付与されている状態と同等で、すべてのノードが返される no-
が付与されていないと、エンジンが Memcached のものを含むレプリケーショングループに属していないノードのみが返される
- Memcached
- クラスターに対して結果が得られる
--(no-)show-cache-node-info
オプションでクラスター内のノードに対する詳細情報の出力有無をコントロールできる
- クラスターに対して結果が得られる
以上、 チバユキ (@batchicchi) がお送りしました。